package com.dmsdbj.itoo.aspect;

import com.dmsdbj.itoo.exception.ItooException;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.Joinpoint;
import org.apache.ibatis.jdbc.Null;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//定义切面
@Aspect
@Slf4j
@Component
public class ExceptionAspect {

    //定义切点
    @Pointcut("execution(* com.dmsdbj.itoo.service.impl.*.*(..))")
    private void pointCut() {

    }

    /**
     * 执行方法之前执行
     *
     * @param joinPoint
     */
//    @Before("pointCut()")
//    public void before(JoinPoint joinPoint) {
//        String classname = joinPoint.getTarget().getClass().getName();
//        String methodname = joinPoint.getSignature().getName();
//        System.out.println("类" + classname + "执行了方法" + methodname);
//        StringBuilder str = new StringBuilder("参数为");
//        for (Object o : joinPoint.getArgs()) {
//            str.append(o);
//        }
//        System.out.println(str.toString());
//    }

    /**
     * 方法正常结束之后执行
     *
     * @param retrunvalue
     */
//    @AfterReturning(value = "pointCut()", returning = "retrunvalue")
//    public void afterretrun(Object retrunvalue) {
//        System.out.println("该方法正常结束后返回值为" + retrunvalue);
//    }

    /**
     * 方法执行过程中发生异常时执行该该方法
     *
     * @param e
     */
    @AfterThrowing(value = "pointCut()", throwing = "e")
    public void afterthrowing(Throwable e) {

//        ItooException itooException = new ItooException();

        if (e instanceof ItooException) {
            try {
                throw e;
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
//            return (ItooException) e;
//            System.out.println("itoo已定义异常" + e);
        } else {
            ItooException itooException = new ItooException(1111,e.getMessage());
            throw new ItooException(1111, e.getMessage());
//            return itooException;
        }
    }

    /**
     * 无论是否正确执行目标方法，都会执行该方法,常用与资源回收
     */
//    @After(value = "pointCut()")
//    public void after() {
//        System.out.println("我是after方法我执行了");
//    }

    /**
     * 于Before增强处理和AfterReturing增强,Around增强处理可以决定目标方法在什么时候执行，如何执行，甚至可以完全阻止目标方法的执行
     *
     * @param proceedingJoinPoint
     */
//    @Around(value = "pointCut()")
//    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//
//        System.out.println("around发生作用，开始执行");
//        Object[] args = proceedingJoinPoint.getArgs();
//        System.out.println("around发生作用，改变了参数");
//        if (null != args && args.length > 1) {
//            //修改目标方法的第一个参数
//            args[0] = "第一个参数的前缀" + args[0];
//        }
//        //用改变后的参数执行方法，保存返回值,需要抛异常
//        Object returnval = proceedingJoinPoint.proceed(args);
//
//        System.out.println("around发生作用，改变了返回值");
//        if (returnval != null) {
//            returnval = (Integer) returnval * (Integer) returnval;
//        }
//        return returnval;
//
//    }


}
